﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область СлужебныеПроцедурыИФункции

#Область ЗагрузкаФайловИзФайловойСистемы

// Продолжение процедуры ФайловаяСистемаКлиент.ПоказатьПомещениеФайла.
Процедура ПоказатьПомещениеФайлаПриПодключенииРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт
	
	Интерактивно         = Контекст.Интерактивно;
	
	Если Не РасширениеПодключено
		И Не Интерактивно Тогда
		ВызватьИсключение НСтр("ru = 'Невозможно загрузить файл без установленного расширения для работы с 1С:Предприятием.'");
	КонецЕсли;
		
	Попытка
		НачатьОбработкуПомещениеФайлов(Контекст);
	Исключение
		Диалог               = Контекст.Диалог; // ДиалогВыбораФайла - 
		Интерактивно         = Контекст.Интерактивно;
		ОбработчикЗавершения = Контекст.ОбработчикЗавершения;
	
		ПараметрыОбработкиРезультата = Новый Структура;
		ПараметрыОбработкиРезультата.Вставить("МножественныйВыбор",   Диалог.МножественныйВыбор);
		ПараметрыОбработкиРезультата.Вставить("ОбработчикЗавершения", ОбработчикЗавершения);
		
		ОписаниеОповещения = Новый ОписаниеОповещения(
			"ПослеПредупрежденияОНедоступностиФайла", ЭтотОбъект, ПараметрыОбработкиРезультата);
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ОписаниеОшибки = ИнформацияОбОшибке.Причина.Описание;
		Если СтрНайти(ОписаниеОшибки, "32(0x00000020)") Тогда 
			ПоказатьПредупреждение(ОписаниеОповещения, НСтр("ru = 'Завершите работу с файлом в другом приложении.'"), , НСтр("ru = 'Файл открыт в другом приложении'"));
		Иначе
			ВызватьИсключение ОписаниеОшибки;
		КонецЕсли;
		
	КонецПопытки;

КонецПроцедуры

// После предупреждения о недоступности файла.
// 
// Параметры:
//  ПараметрыОбработкиРезультата - Структура:
//   * МножественныйВыбор - Булево
//   * ОбработчикЗавершения - ОписаниеОповещения
//
Процедура ПослеПредупрежденияОНедоступностиФайла(ПараметрыОбработкиРезультата) Экспорт

		Если ПараметрыОбработкиРезультата.МножественныйВыбор Тогда
			ОбработатьРезультатПомещенияФайлов(Неопределено, ПараметрыОбработкиРезультата);
		Иначе
			ОбработатьРезультатПомещенияФайла(Ложь, Неопределено, Неопределено,	ПараметрыОбработкиРезультата);
		КонецЕсли;
	
КонецПроцедуры
	
Процедура НачатьОбработкуПомещениеФайлов(Контекст)
	
	Диалог               = Контекст.Диалог; // ДиалогВыбораФайла - 
	Интерактивно         = Контекст.Интерактивно;
	ЗагружаемыеФайлы     = Контекст.ЗагружаемыеФайлы;
	ИдентификаторФормы   = Контекст.ИдентификаторФормы;
	ОбработчикЗавершения = Контекст.ОбработчикЗавершения;
	
	ПараметрыОбработкиРезультата = Новый Структура;
	ПараметрыОбработкиРезультата.Вставить("МножественныйВыбор",   Диалог.МножественныйВыбор);
	ПараметрыОбработкиРезультата.Вставить("ОбработчикЗавершения", ОбработчикЗавершения);
			
	Если Диалог.МножественныйВыбор Тогда
		
		ПомещаемыеФайлы = ?(Интерактивно, Диалог, ЗагружаемыеФайлы);
		ОписаниеОповещения = Новый ОписаниеОповещения(
			"ОбработатьРезультатПомещенияФайлов", ЭтотОбъект, ПараметрыОбработкиРезультата);
		
		Если ЗначениеЗаполнено(ИдентификаторФормы) Тогда
			НачатьПомещениеФайлов(ОписаниеОповещения, ПомещаемыеФайлы, Интерактивно,
				ИдентификаторФормы, Контекст.ДействиеПередНачаломПомещенияФайлов);
		Иначе
			НачатьПомещениеФайлов(ОписаниеОповещения, ПомещаемыеФайлы, Интерактивно, ,
				Контекст.ДействиеПередНачаломПомещенияФайлов);
		КонецЕсли;
		
	Иначе
		
		ПомещаемыйФайл = ?(Интерактивно, Диалог, ЗагружаемыеФайлы.Имя);
		ОписаниеОповещения = Новый ОписаниеОповещения(
			"ОбработатьРезультатПомещенияФайла", ЭтотОбъект, ПараметрыОбработкиРезультата);
		
		Если ЗначениеЗаполнено(ИдентификаторФормы) Тогда
			НачатьПомещениеФайла(ОписаниеОповещения, ЗагружаемыеФайлы.Хранение, ПомещаемыйФайл,
				Интерактивно, ИдентификаторФормы, Контекст.ДействиеПередНачаломПомещенияФайлов);
		Иначе
			НачатьПомещениеФайла(ОписаниеОповещения, ЗагружаемыеФайлы.Хранение, ПомещаемыйФайл,
				Интерактивно, , Контекст.ДействиеПередНачаломПомещенияФайлов);
		КонецЕсли;
		
	КонецЕсли;
КонецПроцедуры

// Завершение помещения файлов.
Процедура ОбработатьРезультатПомещенияФайлов(ПомещенныеФайлы, ПараметрыОбработкиРезультата) Экспорт
	
	ОбработатьРезультатПомещенияФайла(ПомещенныеФайлы <> Неопределено, ПомещенныеФайлы, Неопределено,
		ПараметрыОбработкиРезультата);
	
КонецПроцедуры

// Завершение помещения файла.
Процедура ОбработатьРезультатПомещенияФайла(ВыборВыполнен, АдресИлиРезультатВыбора, ВыбранноеИмяФайла,
		ПараметрыОбработкиРезультата) Экспорт
	
	Если ВыборВыполнен = Истина Тогда
		
		Если ТипЗнч(АдресИлиРезультатВыбора) = Тип("Массив") Тогда
			
			ПомещенныеФайлы = Новый Массив;
			Для Каждого ПомещаемыйФайл Из АдресИлиРезультатВыбора Цикл
				
				СвойстваФайла = Новый Структура("Имя, ПолноеИмя, Хранение");
				ЗаполнитьЗначенияСвойств(СвойстваФайла, ПомещаемыйФайл);
				
				СвойстваФайла.Вставить("ИмяФайла", ПомещаемыйФайл.Имя);
				Если Не ПустаяСтрока(ПомещаемыйФайл.ПолноеИмя) Тогда
					СвойстваФайла.Имя = ПомещаемыйФайл.ПолноеИмя;
				КонецЕсли;
				
				ПомещенныеФайлы.Добавить(СвойстваФайла);
				
			КонецЦикла;
			
		Иначе
			
			ПомещенныеФайлы = Новый Структура;
			ПомещенныеФайлы.Вставить("Хранение", АдресИлиРезультатВыбора);
			ПомещенныеФайлы.Вставить("Имя",      ВыбранноеИмяФайла);
			
		КонецЕсли;
		
	Иначе
		ПомещенныеФайлы = Неопределено;
	КонецЕсли;
	
	ВыполнитьОбработкуОповещения(ПараметрыОбработкиРезультата.ОбработчикЗавершения, ПомещенныеФайлы);
	
КонецПроцедуры

#КонецОбласти

#Область СохранениеФайловВФайловуюСистему

// Продолжение процедуры ФайловаяСистемаКлиент.ПоказатьПолучениеФайлов.
Процедура ПоказатьПолучениеФайловПриПодключенииРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт
	
	Если РасширениеПодключено Тогда
		
		Если Контекст.Интерактивно Тогда
			ПоказатьПолучениеФайловВКаталог(Контекст);
		ИначеЕсли Не ПустаяСтрока(Контекст.Диалог.Каталог)Тогда
			Контекст.Диалог = Контекст.Диалог.Каталог;
			ПоказатьПолучениеФайловВКаталог(Контекст);
		Иначе
			
			ОповещениеОПолученииКаталога = Новый ОписаниеОповещения(
				"ПоказатьПолучениеФайловПослеПолученияКаталогаВременныхФайлов", ЭтотОбъект, Контекст);
			НачатьПолучениеКаталогаВременныхФайлов(ОповещениеОПолученииКаталога);
				
		КонецЕсли;
		
	Иначе
		
		Для Каждого ПолучаемыйФайл Из Контекст.ПолучаемыеФайлы Цикл
			ПолучитьФайл(ПолучаемыйФайл.Хранение, ПолучаемыйФайл.Имя, Истина);
		КонецЦикла;
		
		Если Контекст.ОбработчикЗавершения <> Неопределено Тогда
			ВыполнитьОбработкуОповещения(Контекст.ОбработчикЗавершения, Неопределено);
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ПоказатьПолучениеФайлов.
Процедура ПоказатьПолучениеФайловПослеПолученияКаталогаВременныхФайлов(ИмяКаталогаВременныхФайлов, Контекст) Экспорт
	
	Контекст.Диалог = ИмяКаталогаВременныхФайлов;
	ПоказатьПолучениеФайловВКаталог(Контекст);
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ПоказатьПолучениеФайлов.
Процедура ПоказатьПолучениеФайловВКаталог(Контекст)
	
	ОповещениеОЗавершении = Новый ОписаниеОповещения("ОповеститьОЗавершенииПолученияФайлов", ЭтотОбъект, Контекст);
	НачатьПолучениеФайлов(ОповещениеОЗавершении, Контекст.ПолучаемыеФайлы,
		Контекст.Диалог, Контекст.Интерактивно);
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ПоказатьПолучениеФайлов.
Процедура ОповеститьОЗавершенииПолученияФайлов(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ДополнительныеПараметры.ОбработчикЗавершения <> Неопределено Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикЗавершения, ПолученныеФайлы);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОткрытиеФайлов

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьФайл.
Процедура ОткрытьФайлПослеСохранения(СохраненныеФайлы, ПараметрыОткрытия) Экспорт
	
	Если СохраненныеФайлы = Неопределено Тогда
		ВыполнитьОбработкуОповещения(ПараметрыОткрытия.ОбработчикЗавершения, Ложь);
	Иначе
		
		ОписаниеФайла = 
			?(ТипЗнч(СохраненныеФайлы) = Тип("Массив"), 
				СохраненныеФайлы[0], 
				СохраненныеФайлы);
		
		ПараметрыОткрытия.Вставить("ПутьКФайлу", ОписаниеФайла.ПолноеИмя);
		ОбработчикЗавершения = Новый ОписаниеОповещения(
			"ОткрытьФайлПослеЗавершенияРедактирования", ЭтотОбъект, ПараметрыОткрытия);
		
		ОткрытьФайлВПрограммеПросмотра(ОписаниеФайла.ПолноеИмя, ОбработчикЗавершения, ПараметрыОткрытия.ДляРедактирования);
		
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьФайл.
// Открывает файл в программе просмотра, ассоциированной с расширением файла в операционной системе.
// Блокирует возможность открытия файлов, расширение которых относятся к исполняемым файлам.
//
// Параметры:
//  ПутьКФайлу        - Строка - полный путь к файлу на компьютере, который требуется открыть.
//  Оповещение        - ОписаниеОповещения - оповещение о результате открытия.
//                    если оповещение не задано, в случае ошибки будет показано предупреждение:
//   * ПриложениеЗапущено      - Булево - Истина, если внешнее приложение не вызвало ошибок при открытии.
//   * ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения.
//  ДляРедактирования - Булево - Истина, если файл открывается для редактирования, иначе Ложь.
//
Процедура ОткрытьФайлВПрограммеПросмотра(ПутьКФайлу, Знач Оповещение = Неопределено,
		Знач ДляРедактирования = Ложь)
	
	ФайлИнфо = Новый Файл(ПутьКФайлу);
	
	Контекст = Новый Структура;
	Контекст.Вставить("ФайлИнфо",          ФайлИнфо);
	Контекст.Вставить("Оповещение",        Оповещение);
	Контекст.Вставить("ДляРедактирования", ДляРедактирования);
	
	Оповещение = Новый ОписаниеОповещения(
		"ОткрытьФайлВПрограммеПросмотраПослеПроверкиРасширенияРаботыСФайлами", ЭтотОбъект, Контекст);
	
	ТекстПредложения = НСтр("ru = 'Для открытия файла установите расширение для работы с 1С:Предприятием.'");
	ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Оповещение, ТекстПредложения, Ложь);
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьФайл.
Процедура ОткрытьФайлВПрограммеПросмотраПослеПроверкиРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт
	
	ФайлИнфо = Контекст.ФайлИнфо;
	Если РасширениеПодключено Тогда
		
		Оповещение = Новый ОписаниеОповещения(
			"ОткрытьФайлВПрограммеПросмотраПослеПроверкиСуществования", ЭтотОбъект, Контекст,
			"ОткрытьФайлВПрограммеПросмотраПриОбработкеОшибки", ЭтотОбъект);
		ФайлИнфо.НачатьПроверкуСуществования(Оповещение);
		
	Иначе
		
		ОписаниеОшибки = НСтр("ru = 'Не установлено расширение для работы с 1С:Предприятием, открытие файла недоступно.'");
		ОткрытьФайлВПрограммеПросмотраОповеститьОбОшибке(ОписаниеОшибки, Контекст);
		
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьФайл.
Процедура ОткрытьФайлВПрограммеПросмотраПослеПроверкиСуществования(Существует, Контекст) Экспорт
	
	ФайлИнфо = Контекст.ФайлИнфо;
	Если Существует Тогда
		 
		Оповещение = Новый ОписаниеОповещения(
			"ОткрытьФайлВПрограммеПросмотраПослеПроверкиЭтоФайл", ЭтотОбъект, Контекст,
			"ОткрытьФайлВПрограммеПросмотраПриОбработкеОшибки", ЭтотОбъект);
		ФайлИнфо.НачатьПроверкуЭтоФайл(Оповещение);
		
	Иначе 
		
		ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не существует открываемый файл:
			           |%1'"),
			ФайлИнфо.ПолноеИмя);
		ОткрытьФайлВПрограммеПросмотраОповеститьОбОшибке(ОписаниеОшибки, Контекст);
		
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьФайл.
Процедура ОткрытьФайлВПрограммеПросмотраПослеПроверкиЭтоФайл(ЭтоФайл, Контекст) Экспорт
	
	// АПК:534-выкл методы безопасного запуска обеспечиваются этой функцией
	
	ФайлИнфо = Контекст.ФайлИнфо;
	Если ЭтоФайл Тогда
		
		Если ПустаяСтрока(ФайлИнфо.Расширение) Тогда 
			
			ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Имя файла не содержит расширения:
				           |%1'"),
				ФайлИнфо.ПолноеИмя);
			
			ОткрытьФайлВПрограммеПросмотраОповеститьОбОшибке(ОписаниеОшибки, Контекст);
			Возврат;
			
		КонецЕсли;
		
		Если ЭтоРасширениеИсполняемогоФайла(ФайлИнфо.Расширение) Тогда 
			
			ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Исполняемые файлы открывать запрещено:
				           |%1'"),
				ФайлИнфо.ПолноеИмя);
			
			ОткрытьФайлВПрограммеПросмотраОповеститьОбОшибке(ОписаниеОшибки, Контекст);
			Возврат;
			
		КонецЕсли;
		
		Оповещение          = Контекст.Оповещение;
		ДождатьсяЗавершения = Контекст.ДляРедактирования;
		
		Оповещение = Новый ОписаниеОповещения(
			"ОткрытьФайлВПрограммеПросмотраПослеЗапускаПриложения", ЭтотОбъект, Контекст,
			"ОткрытьФайлВПрограммеПросмотраПриОбработкеОшибки", ЭтотОбъект);
		НачатьЗапускПриложения(Оповещение, ФайлИнфо.ПолноеИмя,, ДождатьсяЗавершения);
		
	Иначе 
		
		ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не существует открываемый файл:
			           |%1'"),
			ФайлИнфо.ПолноеИмя);
			
		ОткрытьФайлВПрограммеПросмотраОповеститьОбОшибке(ОписаниеОшибки, Контекст);
		
	КонецЕсли;
	
	// АПК:534-вкл
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьФайл.
Процедура ОткрытьФайлВПрограммеПросмотраПослеЗапускаПриложения(КодВозврата, Контекст) Экспорт 
	
	Оповещение = Контекст.Оповещение;
	
	Если Оповещение <> Неопределено Тогда 
		ПриложениеЗапущено = (КодВозврата = 0);
		ВыполнитьОбработкуОповещения(Оповещение, ПриложениеЗапущено);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьФайл.
Процедура ОткрытьФайлВПрограммеПросмотраПриОбработкеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
	
	СтандартнаяОбработка = Ложь;
	ОткрытьФайлВПрограммеПросмотраОповеститьОбОшибке("", Контекст);
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьФайл.
Процедура ОткрытьФайлПослеЗавершенияРедактирования(ПриложениеЗапущено, ПараметрыОткрытия) Экспорт
	
	Если ПриложениеЗапущено
		И ПараметрыОткрытия.Свойство("АдресДвоичныхДанныхДляОбновления") Тогда
		
		Оповещение = Новый ОписаниеОповещения(
			"ОткрытьФайлПослеОбновленияДанныхВХранилище", ЭтотОбъект, ПараметрыОткрытия);
			
		НачатьПомещениеФайла(Оповещение, ПараметрыОткрытия.АдресДвоичныхДанныхДляОбновления,
			ПараметрыОткрытия.ПутьКФайлу, Ложь);
		
	Иначе
		ВыполнитьОбработкуОповещения(ПараметрыОткрытия.ОбработчикЗавершения, ПриложениеЗапущено);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьФайл.
Процедура ОткрытьФайлПослеОбновленияДанныхВХранилище(ДанныеОбновлены, АдресДанных, ИмяФайла,
		ПараметрыОткрытия) Экспорт
	
	Если ПараметрыОткрытия.Свойство("УдалятьПослеОбновленияДанных") Тогда
		
		ДополнительныеПараметры = Новый Структура;
		ДополнительныеПараметры.Вставить("ДанныеОбновлены", ДанныеОбновлены);
		ДополнительныеПараметры.Вставить("ПараметрыОткрытия", ПараметрыОткрытия);
		
		ОписаниеОповещения = Новый ОписаниеОповещения(
			"ОткрытьФайлПослеУдаленияВременногоФайла", ЭтотОбъект, ДополнительныеПараметры);
			
		НачатьУдалениеФайлов(ОписаниеОповещения, ИмяФайла);
		
	Иначе
		ВыполнитьОбработкуОповещения(ПараметрыОткрытия.ОбработчикЗавершения, ДанныеОбновлены);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьФайл.
Процедура ОткрытьФайлПослеУдаленияВременногоФайла(ДополнительныеПараметры) Экспорт
	
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ПараметрыОткрытия.ОбработчикЗавершения,
		ДополнительныеПараметры.ДанныеОбновлены);
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьФайл.
Процедура ОткрытьФайлВПрограммеПросмотраОповеститьОбОшибке(ОписаниеОшибки, Контекст)
	
	Если Не ПустаяСтрока(ОписаниеОшибки) Тогда 
		ПоказатьПредупреждение(, ОписаниеОшибки);
	КонецЕсли;
	
	ПриложениеЗапущено = Ложь;
	ВыполнитьОбработкуОповещения(Контекст.Оповещение, ПриложениеЗапущено);
	
КонецПроцедуры

// Параметры:
//  Расширение - Строка - свойство Расширение объекта Файл.
//
Функция ЭтоРасширениеИсполняемогоФайла(Знач Расширение)
	
	Расширение = ВРег(Расширение);
	
	// Windows
	Возврат Расширение = ".BAT" // Batch File
		Или Расширение = ".BIN" // Binary Executable
		Или Расширение = ".CMD" // Command Script
		Или Расширение = ".COM" // Приложение MS-DOS
		Или Расширение = ".CPL" // Control Panel Extension
		Или Расширение = ".EXE" // Исполняемый файл
		Или Расширение = ".GADGET" // Binary Executable
		Или Расширение = ".HTA" // HTML Application
		Или Расширение = ".INF1" // Setup Information File
		Или Расширение = ".INS" // Internet Communication Settings
		Или Расширение = ".INX" // InstallShield Compiled Script
		Или Расширение = ".ISU" // InstallShield Uninstaller Script
		Или Расширение = ".JOB" // Windows Task Scheduler Job File
		Или Расширение = ".LNK" // File Shortcut
		Или Расширение = ".MSC" // Microsoft Common Console Document
		Или Расширение = ".MSI" // Windows Installer Package
		Или Расширение = ".MSP" // Windows Installer Patch
		Или Расширение = ".MST" // Windows Installer Setup Transform File
		Или Расширение = ".OTM" // Макрос Microsoft Outlook
		Или Расширение = ".PAF" // Portable Application Installer File
		Или Расширение = ".PIF" // Program Information File
		Или Расширение = ".PS1" // Windows PowerShell Cmdlet
		Или Расширение = ".REG" // Registry Data File
		Или Расширение = ".RGS" // Registry Script
		Или Расширение = ".SCT" // Windows Scriptlet
		Или Расширение = ".SHB" // Windows Document Shortcut
		Или Расширение = ".SHS" // Shell Scrap Object
		Или Расширение = ".U3P" // U3 Smart Application
		Или Расширение = ".VB"  // VBScript File
		Или Расширение = ".VBE" // VBScript Encoded Script
		Или Расширение = ".VBS" // VBScript File
		Или Расширение = ".VBSCRIPT" // Visual Basic Script
		Или Расширение = ".WS"  // Windows Script
		Или Расширение = ".WSF" // Windows Script
	// Linux
		Или Расширение = ".CSH" // C Shell Script
		Или Расширение = ".KSH" // Unix Korn Shell Script
		Или Расширение = ".OUT" // Исполняемый файл
		Или Расширение = ".RUN" // Исполняемый файл
		Или Расширение = ".SH"  // Shell Script
	// macOS
		Или Расширение = ".ACTION" // Automator Action
		Или Расширение = ".APP" // Исполняемый файл
		Или Расширение = ".COMMAND" // Terminal Command
		Или Расширение = ".OSX" // Исполняемый файл
		Или Расширение = ".WORKFLOW" // Automator Workflow
	// Прочие
		Или Расширение = ".AIR" // Установочный пакет Adobe AIR
		Или Расширение = ".COFFIE" // Сценарий CoffeeScript (JavaScript)
		Или Расширение = ".JAR" // Архив Java
		Или Расширение = ".JS"  // JScript File
		Или Расширение = ".JSE" // JScript Encoded File
		Или Расширение = ".PLX" // Исполняемый файл Perl
		Или Расширение = ".PYC" // Компилированный файл Python
		Или Расширение = ".PYO"; // Оптимизированный код Python
	
КонецФункции

#КонецОбласти

#Область ОткрытьПроводник

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьПроводник.
Процедура ОткрытьПроводникПослеПроверкиРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт
	
	ФайлИнфо = Контекст.ФайлИнфо;
	
	Если РасширениеПодключено Тогда
		Оповещение = Новый ОписаниеОповещения(
			"ОткрытьПроводникПослеПроверкиСуществования", ЭтотОбъект, Контекст, 
			"ОткрытьПроводникПриОбработкеОшибки", ЭтотОбъект);
		ФайлИнфо.НачатьПроверкуСуществования(Оповещение);
	Иначе
		ОписаниеОшибки = НСтр("ru = 'Для того чтобы открыть папку, установите расширение для работы с 1С:Предприятием.'");
		ОткрытьПроводникОповеститьОбОшибке(ОписаниеОшибки, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьПроводник.
Процедура ОткрытьПроводникПослеПроверкиСуществования(Существует, Контекст) Экспорт 
	
	ФайлИнфо = Контекст.ФайлИнфо;
	
	Если Существует Тогда 
		Оповещение = Новый ОписаниеОповещения(
			"ОткрытьПроводникПослеПроверкиЭтоФайл", ЭтотОбъект, Контекст, 
			"ОткрытьПроводникПриОбработкеОшибки", ЭтотОбъект);
		ФайлИнфо.НачатьПроверкуЭтоФайл(Оповещение);
	Иначе 
		ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Каталог, который требуется открыть в проводнике, не существует:
			           |""%1""'"),
			ФайлИнфо.ПолноеИмя);
		ОткрытьПроводникОповеститьОбОшибке(ОписаниеОшибки, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьПроводник.
Процедура ОткрытьПроводникПослеПроверкиЭтоФайл(ЭтоФайл, Контекст) Экспорт 
	
	// АПК:534-выкл методы безопасного запуска обеспечиваются этой функцией
	
	ФайлИнфо = Контекст.ФайлИнфо;
	
	Оповещение = Новый ОписаниеОповещения(,,, "ОткрытьПроводникПриОбработкеОшибки", ЭтотОбъект);
	Если ЭтоФайл Тогда
		Если ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда
			НачатьЗапускПриложения(Оповещение, "explorer.exe /select, """ + ФайлИнфо.ПолноеИмя + """");
		Иначе // Это Linux или macOS.
			НачатьЗапускПриложения(Оповещение, "file:///" + ФайлИнфо.Путь);
		КонецЕсли;
	Иначе // Это каталог.
		НачатьЗапускПриложения(Оповещение, "file:///" + ФайлИнфо.ПолноеИмя);
	КонецЕсли;
	
	// АПК:534-вкл
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьПроводник.
Процедура ОткрытьПроводникПриОбработкеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт 
	
	СтандартнаяОбработка = Ложь;
	ОткрытьПроводникОповеститьОбОшибке("", Контекст);
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьПроводник.
Процедура ОткрытьПроводникОповеститьОбОшибке(ОписаниеОшибки, Контекст)
	
	Если Не ПустаяСтрока(ОписаниеОшибки) Тогда 
		ПоказатьПредупреждение(, ОписаниеОшибки);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОткрытьНавигационнуюСсылку

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку.
Процедура ОткрытьНавигационнуюСсылкуПослеПроверкиРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт
	
	// АПК:534-выкл методы безопасного запуска обеспечиваются этой функцией
	
	НавигационнаяСсылка = Контекст.НавигационнаяСсылка;
	
	Если РасширениеПодключено Тогда
		
		Оповещение          = Контекст.Оповещение;
		ДождатьсяЗавершения = (Оповещение <> Неопределено);
		
		Оповещение = Новый ОписаниеОповещения(
			"ОткрытьНавигационнуюСсылкуПослеЗапускаПриложения", ЭтотОбъект, Контекст,
			"ОткрытьНавигационнуюСсылкуПриОбработкеОшибки", ЭтотОбъект);
		НачатьЗапускПриложения(Оповещение, НавигационнаяСсылка,, ДождатьсяЗавершения);
		
	Иначе
		ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Расширение для работы с 1С:Предприятием не установлено, переход по ссылке ""%1"" невозможен.'"),
			НавигационнаяСсылка);
		ОткрытьНавигационнуюСсылкуОповеститьОбОшибке(ОписаниеОшибки, Контекст);
	КонецЕсли;
	
	// АПК:534-вкл
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку.
Процедура ОткрытьНавигационнуюСсылкуПослеЗапускаПриложения(КодВозврата, Контекст) Экспорт 
	
	Оповещение = Контекст.Оповещение;
	
	Если Оповещение <> Неопределено Тогда 
		ПриложениеЗапущено = (КодВозврата = 0 Или КодВозврата = Неопределено);
		ВыполнитьОбработкуОповещения(Оповещение, ПриложениеЗапущено);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку.
Процедура ОткрытьНавигационнуюСсылкуПриОбработкеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт 
	
	СтандартнаяОбработка = Ложь;
	ОткрытьНавигационнуюСсылкуОповеститьОбОшибке("", Контекст);
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку.
Процедура ОткрытьНавигационнуюСсылкуОповеститьОбОшибке(ОписаниеОшибки, Контекст) Экспорт
	
	Оповещение = Контекст.Оповещение;
	
	Если Оповещение = Неопределено Тогда
		Если Не ПустаяСтрока(ОписаниеОшибки) Тогда 
			ПоказатьПредупреждение(, ОписаниеОшибки);
		КонецЕсли;
	Иначе 
		ПриложениеЗапущено = Ложь;
		ВыполнитьОбработкуОповещения(Оповещение, ПриложениеЗапущено);
	КонецЕсли;
	
КонецПроцедуры

// Проверяет, является ли переданная строка веб ссылкой.
// 
// Параметры:
//  Строка - Строка - переданная ссылка.
// 
// Возвращаемое значение:
//  Булево
// 
Функция ЭтоВебСсылка(Строка) Экспорт
	
	Возврат СтрНачинаетсяС(Строка, "http://")  // обычное соединение.
		Или СтрНачинаетсяС(Строка, "https://");// защищенное соединение.
	
КонецФункции

// Проверяет, является ли переданная строка ссылкой на встроенную справку.
// 
// Параметры:
//  Строка - Строка - переданная ссылка.
// 
// Возвращаемое значение:
//  Булево
//
Функция ЭтоСсылкаНаСправку(Строка) Экспорт
	
	Возврат СтрНачинаетсяС(Строка, "v8help://");
	
КонецФункции

// Проверяет, является ли переданная строка допустимой ссылкой по белому списку протоколов.
// 
// Параметры:
//  Строка - Строка - переданная ссылка.
// 
// Возвращаемое значение:
//  Булево
//
Функция ЭтоДопустимаяСсылка(Строка) Экспорт
	
	Возврат СтрНачинаетсяС(Строка, "e1c:")
		Или СтрНачинаетсяС(Строка, "e1cib/")
		Или СтрНачинаетсяС(Строка, "e1ccs/")
		Или СтрНачинаетсяС(Строка, "v8help:")
		Или СтрНачинаетсяС(Строка, "http:")
		Или СтрНачинаетсяС(Строка, "https:")
		Или СтрНачинаетсяС(Строка, "mailto:")
		Или СтрНачинаетсяС(Строка, "tel:")
		Или СтрНачинаетсяС(Строка, "skype:")
		Или СтрНачинаетсяС(Строка, "market:")
		Или СтрНачинаетсяС(Строка, "itms-apps:");
	
КонецФункции

#КонецОбласти

#Область ЗапуститьПрограмму

// Продолжение процедуры ФайловаяСистемаКлиент.ЗапуститьПрограмму.
Процедура ЗапуститьПрограммуПослеПроверкиРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт
	
	Если РасширениеПодключено Тогда
		
		ТекущийКаталог = Контекст.ТекущийКаталог;
		
		Если ПустаяСтрока(ТекущийКаталог) Тогда
			ЗапуститьПрограммуНачатьЗапуск(Контекст);
		Иначе 
			ФайлИнфо = Новый Файл(ТекущийКаталог);
			Оповещение = Новый ОписаниеОповещения(
				"ЗапуститьПрограммуПослеПроверкиСуществования", ЭтотОбъект, Контекст,
				"ЗапуститьПрограммуПриОбработкеОшибки", ЭтотОбъект);
			ФайлИнфо.НачатьПроверкуСуществования(Оповещение);
		КонецЕсли;
		
	Иначе
		ОписаниеОшибки = НСтр("ru = 'Не установлено расширение для работы с 1С:Предприятием, запуск программы невозможен.'");
		ЗапуститьПрограммуОповеститьОбОшибке(ОписаниеОшибки, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ЗапуститьПрограмму.
Процедура ЗапуститьПрограммуПослеПроверкиСуществования(Существует, Контекст) Экспорт
	
	ТекущийКаталог = Контекст.ТекущийКаталог;
	ФайлИнфо = Новый Файл(ТекущийКаталог);
	
	Если Существует Тогда 
		Оповещение = Новый ОписаниеОповещения(
			"ЗапуститьПрограммуПослеПроверкиЭтоКаталог", ЭтотОбъект, Контекст,
			"ЗапуститьПрограммуПриОбработкеОшибки", ЭтотОбъект);
		ФайлИнфо.НачатьПроверкуЭтоКаталог(Оповещение);
	Иначе 
		СтрокаКоманды = Контекст.СтрокаКоманды;
		
		ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не удалось запустить программу
			           |%1
			           |т.к. папка не существует:
					   |%2'"),
			СтрокаКоманды, ТекущийКаталог);
		ЗапуститьПрограммуОповеститьОбОшибке(ОписаниеОшибки, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаСлужебныйКлиент.ОткрытьФайлВПрограммеПросмотра
//
Процедура ЗапуститьПрограммуПослеПроверкиЭтоКаталог(ЭтоКаталог, Контекст) Экспорт
	
	Если ЭтоКаталог Тогда
		ЗапуститьПрограммуНачатьЗапуск(Контекст);
	Иначе
		СтрокаКоманды = Контекст.СтрокаКоманды;
		ТекущийКаталог = Контекст.ТекущийКаталог;
		
		ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не удалось запустить программу
			           |%1
			           |т.к. указанный объект не является папкой:
					   |%2'"),
			СтрокаКоманды, ТекущийКаталог);
		ЗапуститьПрограммуОповеститьОбОшибке(ОписаниеОшибки, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ЗапуститьПрограмму.
Процедура ЗапуститьПрограммуНачатьЗапуск(Контекст)
	
	// АПК:534-выкл методы безопасного запуска обеспечиваются этой функцией
	
	Если Контекст.КодировкаПотоков = Неопределено Тогда 
		Контекст.КодировкаПотоков = КодировкаСтандартныхПотоков();
	КонецЕсли;
	
	// Для cmd не всегда активна текущая кодовая страница, поэтому всегда задаем по-умолчанию
	Если Контекст.КодировкаИсполнения = Неопределено И ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда 
		Контекст.КодировкаИсполнения = "CP866";
	КонецЕсли;

	Если Контекст.ВыполнитьСНаивысшимиПравами Тогда 
		ЗапуститьПрограммуСНаивысшимиПравами(Контекст);
		Возврат;
	КонецЕсли;
		
	ВыполнитьМетодомПлатформы = Истина;
		
	#Если Не ВебКлиент И Не МобильныйКлиент Тогда
		Если ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда
			ВыполнитьМетодомПлатформы = Ложь; 
			СтрокаКоманды = Контекст.СтрокаКоманды;
			ТекущийКаталог = Контекст.ТекущийКаталог;
			КодировкаИсполнения = Контекст.КодировкаИсполнения;
			ДождатьсяЗавершения = Контекст.ДождатьсяЗавершения;
			
			СтрокаКоманды = ОбщегоНазначенияСлужебныйКлиентСервер.СтрокаЗапускаКомандыWindows(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодировкаИсполнения);
			
			Попытка
				Оболочка = Новый COMОбъект("Wscript.Shell");
				КодВозврата = Оболочка.Run(СтрокаКоманды, 0, ДождатьсяЗавершения);
				Оболочка = Неопределено;
			Исключение
				Оболочка = Неопределено;
				ИнформацияОбОшибке = ИнформацияОбОшибке();
				СтандартнаяОбработка = Истина;
				ЗапуститьПрограммуПриОбработкеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст);
				Возврат;
			КонецПопытки;
			
			Если КодВозврата = Неопределено Тогда 
				КодВозврата = 0;
			КонецЕсли;
			
			ЗапуститьПрограммуПослеЗапускаПриложения(КодВозврата, Контекст);
		КонецЕсли;
	#КонецЕсли
	
	Если ВыполнитьМетодомПлатформы Тогда 
		СтрокаКоманды = Контекст.СтрокаКоманды;
		ТекущийКаталог = Контекст.ТекущийКаталог;
		ДождатьсяЗавершения = Контекст.ДождатьсяЗавершения;
		КодировкаИсполнения = Контекст.КодировкаИсполнения;
		
		Если ОбщегоНазначенияКлиент.ЭтоLinuxКлиент() И ЗначениеЗаполнено(КодировкаИсполнения) Тогда
			СтрокаКоманды = "LANGUAGE=" + КодировкаИсполнения + " " + СтрокаКоманды;
		КонецЕсли;
		
		Оповещение = Новый ОписаниеОповещения(
			"ЗапуститьПрограммуПослеЗапускаПриложения", ЭтотОбъект, Контекст,
			"ЗапуститьПрограммуПриОбработкеОшибки", ЭтотОбъект);
		НачатьЗапускПриложения(Оповещение, СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения);
	КонецЕсли;
	// АПК:534-вкл
	
КонецПроцедуры

// Возвращает кодировку стандартных поток вывода и ошибок, используемую в текущей ОС.
//
// Возвращаемое значение:
//  КодировкаТекста
//
Функция КодировкаСтандартныхПотоков()
	
	Если ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда
		Возврат "CP866";
	Иначе
		Возврат "UTF-8";
	КонецЕсли;
	
КонецФункции

// Продолжение процедуры ФайловаяСистемаКлиент.ЗапуститьПрограмму.
Процедура ЗапуститьПрограммуПослеЗапускаПриложения(КодВозврата, Контекст) Экспорт 
	
	Оповещение = Контекст.Оповещение;
	Если Оповещение = Неопределено Тогда
		Возврат;
	КонецЕсли;
		
	Если Контекст.ДождатьсяЗавершения И КодВозврата = Неопределено Тогда
		ОписаниеОшибки = НСтр("ru = 'Возникла непредвиденная ситуация при запуске программы.'");
		ЗапуститьПрограммуОповеститьОбОшибке(ОписаниеОшибки, Контекст);
		Возврат;
	КонецЕсли;
	
	Результат = РезультатЗапускаПрограммы();
	Результат.ПриложениеЗапущено = Истина;
	Результат.КодВозврата = КодВозврата;
	Если Контекст.ДождатьсяЗавершения Тогда
		ЗаполнитьРезультатПотока(Результат, Контекст);
	КонецЕсли;
	ВыполнитьОбработкуОповещения(Оповещение, Результат);
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ЗапуститьПрограмму.
Процедура ЗапуститьПрограммуПриОбработкеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт 
	
	СтандартнаяОбработка = Ложь;
	ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
	ЗапуститьПрограммуОповеститьОбОшибке(ОписаниеОшибки, Контекст);
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ЗапуститьПрограмму.
Процедура ЗапуститьПрограммуОповеститьОбОшибке(ОписаниеОшибки, Контекст)
	
	Оповещение = Контекст.Оповещение;
	Если Оповещение = Неопределено Тогда
		Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
			ПоказатьПредупреждение(, ОписаниеОшибки);
		КонецЕсли;
		Возврат;
	КонецЕсли;
		
	Результат = РезультатЗапускаПрограммы();
	Результат.ОписаниеОшибки = ОписаниеОшибки;
	Если Контекст.ДождатьсяЗавершения Тогда
		ЗаполнитьРезультатПотока(Результат, Контекст);
	КонецЕсли;
	ВыполнитьОбработкуОповещения(Оповещение, Результат);
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ЗапуститьПрограмму.
Функция РезультатЗапускаПрограммы()
	
	Результат = Новый Структура;
	Результат.Вставить("ПриложениеЗапущено", Ложь);
	Результат.Вставить("ОписаниеОшибки", "");
	Результат.Вставить("КодВозврата", -13);
	Результат.Вставить("ПотокВывода", "");
	Результат.Вставить("ПотокОшибок", "");
	
	Возврат Результат;
	
КонецФункции

// Продолжение процедуры ФайловаяСистемаКлиент.ЗапуститьПрограмму.
Процедура ЗапуститьПрограммуСНаивысшимиПравами(Контекст)
	
#Если ВебКлиент Тогда
	ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Не удалось запустить программу
		           |%1
		           |по причине:
		           |Запуск программ с повышением привилегий недоступен в веб-клиенте.'"),
		Контекст.СтрокаКоманды);
	ЗапуститьПрограммуОповеститьОбОшибке(ОписаниеОшибки, Контекст);
#ИначеЕсли МобильныйКлиент Тогда
	ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Не удалось запустить программу
		           |%1
		           |по причине:
		           |Запуск программ с повышением привилегий недоступен в мобильном клиенте.'"),
		Контекст.СтрокаКоманды);
	ЗапуститьПрограммуОповеститьОбОшибке(ОписаниеОшибки, Контекст);
#Иначе
	
	Если ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда 
		ЗапуститьПрограммуСНаивысшимиПравамиWindows(Контекст);
	ИначеЕсли ОбщегоНазначенияКлиент.ЭтоLinuxКлиент() Тогда 
		ЗапуститьПрограммуСНаивысшимиПравамиLinux(Контекст);
	Иначе
		ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не удалось запустить программу
			           |%1
			           |по причине:
			           |Запуск программ с повышением привилегий доступен только в Windows и Linux.'"),
			Контекст.СтрокаКоманды);
		ЗапуститьПрограммуОповеститьОбОшибке(ОписаниеОшибки, Контекст);
	КонецЕсли;
	
#КонецЕсли
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ЗапуститьПрограмму
//
Процедура ЗаполнитьРезультатПотока(Результат, Контекст)
	
#Если Не ВебКлиент Тогда
		
	Если Контекст.ПолучитьПотокВывода
		И Не ПустаяСтрока(Контекст.ИмяФайлаПотокаВывода) Тогда
		Результат.ПотокВывода = ПрочитатьФайлПотока(Контекст.ИмяФайлаПотокаВывода, Контекст.КодировкаПотоков);
	КонецЕсли;
	
	Если Контекст.ПолучитьПотокОшибок
		И Не ПустаяСтрока(Контекст.ИмяФайлаПотокаОшибок) Тогда
		Результат.ПотокОшибок = ПрочитатьФайлПотока(Контекст.ИмяФайлаПотокаОшибок, Контекст.КодировкаПотоков);
	КонецЕсли;
		
#КонецЕсли

КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ЗапуститьПрограмму
//
Функция ПрочитатьФайлПотока(ПутьКФайлу, КодировкаПотоков)
	
	// АПК:566-выкл - синхронные вызовы вне тонкого клиента
	
#Если ВебКлиент Тогда
	Возврат "";
#Иначе
	ФайлПотока = Новый Файл(ПутьКФайлу);
	Если Не ФайлПотока.Существует() Тогда
		Возврат "";
	КонецЕсли;
	
	ЧтениеФайлаПотока = Новый ЧтениеТекста(ПутьКФайлу, КодировкаПотоков);
	Результат = ЧтениеФайлаПотока.Прочитать();
	ЧтениеФайлаПотока.Закрыть();
	
	УдалитьФайлы(ПутьКФайлу);
	
	Возврат ?(Результат = Неопределено, "", Результат);
#КонецЕсли
	
	// АПК:566-вкл
	
КонецФункции

#Если Не ВебКлиент И Не МобильныйКлиент Тогда

// Продолжение процедуры ФайловаяСистемаКлиент.ЗапуститьПрограмму
//
Процедура ЗапуститьПрограммуСНаивысшимиПравамиWindows(Контекст)
	
	// АПК:534-выкл методы безопасного запуска обеспечиваются этой функцией
	
	СтрокаКоманды = Контекст.СтрокаКоманды;
	ТекущийКаталог = Контекст.ТекущийКаталог;
	КодировкаИсполнения = Контекст.КодировкаИсполнения;
	
	ДождатьсяЗавершения = Ложь;
	
	СтрокаКоманды = ОбщегоНазначенияСлужебныйКлиентСервер.СтрокаЗапускаКомандыWindows(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодировкаИсполнения);
	
	Попытка
		Оболочка = Новый COMОбъект("Shell.Application");
		// Запуск с повышением привилегий.
		КодВозврата = Оболочка.ShellExecute("cmd", "/c """ + СтрокаКоманды + """",, "runas", 0);
		Оболочка = Неопределено;
	Исключение
		Оболочка = Неопределено;
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		СтандартнаяОбработка = Истина;
		ЗапуститьПрограммуПриОбработкеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст);
		Возврат;
	КонецПопытки;
	
	Если КодВозврата = Неопределено Тогда 
		КодВозврата = 0;
	КонецЕсли;
	
	ЗапуститьПрограммуПослеЗапускаПриложения(КодВозврата, Контекст);
	
	// АПК:534-вкл
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ЗапуститьПрограмму
//
Процедура ЗапуститьПрограммуСНаивысшимиПравамиLinux(Контекст)
	
	// АПК:534-выкл методы безопасного запуска обеспечиваются этой функцией
	
	ТекущийКаталог = Контекст.ТекущийКаталог;
	СтрокаКоманды = Контекст.СтрокаКоманды;
	
	КомандаСПовышениемПривилегий = "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY " + СтрокаКоманды;
	ДождатьсяЗавершения = Истина;
	
	Оповещение = Новый ОписаниеОповещения(
		"ЗапуститьПрограммуПослеЗапускаПриложения", ЭтотОбъект, Контекст,
		"ЗапуститьПрограммуПриОбработкеОшибки", ЭтотОбъект);
	НачатьЗапускПриложения(Оповещение, КомандаСПовышениемПривилегий, ТекущийКаталог, ДождатьсяЗавершения);
	
	// АПК:534-вкл
	
КонецПроцедуры

#КонецЕсли

#КонецОбласти

#Область ВыборКаталога

// Продолжение процедуры ФайловаяСистемаКлиент.ВыбратьКаталог.
Процедура ВыбратьКаталогПриПодключенииРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт
	
	Если Не РасширениеПодключено Тогда
		ВыполнитьОбработкуОповещения(Контекст.ОбработчикЗавершения, "");
		Возврат;
	КонецЕсли;
	
	ОписаниеОповещения = Новый ОписаниеОповещения(
		"ВыбратьКаталогПриОкончанииВыбора", ЭтотОбъект, Контекст.ОбработчикЗавершения);
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
	Диалог.МножественныйВыбор = Ложь;
	Если Не ПустаяСтрока(Контекст.Заголовок) Тогда
		Диалог.Заголовок = Контекст.Заголовок;
	КонецЕсли;
	Если Не ПустаяСтрока(Контекст.Каталог) Тогда
		Диалог.Каталог = Контекст.Каталог;
	КонецЕсли;
	
	Диалог.Показать(ОписаниеОповещения);
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.ВыбратьКаталог.
Процедура ВыбратьКаталогПриОкончанииВыбора(МассивКаталогов, ОбработчикЗавершения) Экспорт
	
	ПутьККаталогу = 
		?(МассивКаталогов = Неопределено Или МассивКаталогов.Количество() = 0,
			"", 
			МассивКаталогов[0]);
	
	ВыполнитьОбработкуОповещения(ОбработчикЗавершения, ПутьККаталогу);
	
КонецПроцедуры

#КонецОбласти

#Область ПоказатьДиалогВыбора

// Продолжение процедуры ФайловаяСистемаКлиент.ПоказатьДиалогВыбора
//
Процедура ПоказатьДиалогВыбораПриПодключенииРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт
	
	Если Не РасширениеПодключено Тогда
		ВыполнитьОбработкуОповещения(Контекст.ОбработчикЗавершения, "");
		Возврат;
	КонецЕсли;
	
	Контекст.Диалог.Показать(Контекст.ОбработчикЗавершения);
	
КонецПроцедуры

#КонецОбласти

#Область РасширениеРаботыСФайлами

Процедура НачатьПодключениеРасширенияРаботыСФайламиПриУстановкеРасширения(Подключено, Контекст) Экспорт
	
	// Если расширение и так уже подключено, незачем про него спрашивать.
	Если Подключено Тогда
		ВыполнитьОбработкуОповещения(Контекст.ОписаниеОповещенияЗавершение, "ПодключениеНеТребуется");
		Возврат;
	КонецЕсли;
	
	// В веб клиенте под macOS расширение доступно только в браузере Chrome.
	Если ОбщегоНазначенияКлиент.ЭтоMacOSКлиент() 
			И НЕ ДоступноРасширениеРаботыСФайлами() Тогда
		ВыполнитьОбработкуОповещения(Контекст.ОписаниеОповещенияЗавершение);
		Возврат;
	КонецЕсли;
	
	ИмяПараметра = "СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами";
	ПервоеОбращениеЗаСеанс = ПараметрыПриложения[ИмяПараметра] = Неопределено;
	Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
		ПараметрыПриложения.Вставить(ИмяПараметра, ПредлагатьУстановкуРасширенияРаботыСФайлами());
	КонецЕсли;
	
	ПредлагатьУстановкуРасширенияРаботыСФайлами = ПараметрыПриложения[ИмяПараметра] Или ПервоеОбращениеЗаСеанс;
	Если Контекст.ВозможноПродолжениеБезУстановки И Не ПредлагатьУстановкуРасширенияРаботыСФайлами Тогда
		
		ВыполнитьОбработкуОповещения(Контекст.ОписаниеОповещенияЗавершение);
		
	Иначе 
		
		ПараметрыФормы = Новый Структура;
		ПараметрыФормы.Вставить("ТекстПредложения", Контекст.ТекстПредложения);
		ПараметрыФормы.Вставить("ВозможноПродолжениеБезУстановки", Контекст.ВозможноПродолжениеБезУстановки);
		ОткрытьФорму(
			"ОбщаяФорма.ВопросОбУстановкеРасширенияРаботыСФайлами", 
			ПараметрыФормы,,,,, 
			Контекст.ОписаниеОповещенияЗавершение);
		
	КонецЕсли;
	
КонецПроцедуры

Процедура НачатьПодключениеРасширенияРаботыСФайламиПриОтветеНаВопросОбУстановке(Действие, ОповещениеОЗакрытии) Экспорт
	
	РасширениеПодключено = (Действие = "РасширениеПодключено" Или Действие = "ПодключениеНеТребуется");
	
#Если ВебКлиент Тогда
	Если Действие = "БольшеНеПредлагать"
		Или Действие = "РасширениеПодключено" Тогда
		
		СистемнаяИнформация = Новый СистемнаяИнформация();
		ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента;
		ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"] = Ложь;
		ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить(
			"НастройкиПрограммы/ПредлагатьУстановкуРасширенияРаботыСФайлами", ИдентификаторКлиента, Ложь);
		
	КонецЕсли;
#КонецЕсли
	
	ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, РасширениеПодключено);
	
КонецПроцедуры

Функция ПредлагатьУстановкуРасширенияРаботыСФайлами()
	
	СистемнаяИнформация = Новый СистемнаяИнформация();
	ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента;
	Возврат ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить(
		"НастройкиПрограммы/ПредлагатьУстановкуРасширенияРаботыСФайлами", ИдентификаторКлиента, Истина);
	
КонецФункции

Функция ДоступноРасширениеРаботыСФайлами()

	СистемнаяИнформация = Новый СистемнаяИнформация;
	Возврат СтрНайти(СистемнаяИнформация.ИнформацияПрограммыПросмотра, "Chrome") > 0;

КонецФункции

#КонецОбласти

#Область ВременныеФайлы

#Область СоздатьВременныйКаталог

// Продолжение процедуры ФайловаяСистемаКлиент.СоздатьВременныйКаталог.
// 
// Параметры:
//  РасширениеПодключено - Булево
//  Контекст - Структура:
//   * Оповещение - ОписаниеОповещения
//   * Расширение - Строка
//
Процедура СоздатьВременныйКаталогПослеПроверкиРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт
	
	Если РасширениеПодключено Тогда
		Оповещение = Новый ОписаниеОповещения(
			"СоздатьВременныйКаталогПослеПолученияВременногоКаталога", ЭтотОбъект, Контекст,
			"СоздатьВременныйКаталогПриОбработкеОшибки", ЭтотОбъект);
		НачатьПолучениеКаталогаВременныхФайлов(Оповещение);
	Иначе
		СоздатьВременныйКаталогОповеститьОбОшибке(НСтр("ru = 'Не удалось установить расширение для работы с 1С:Предприятием.'"), Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.СоздатьВременныйКаталог.
// 
// Параметры:
//  ИмяКаталогаВременныхФайлов - Строка
//  Контекст - Структура:
//   * Оповещение - ОписаниеОповещения
//   * Расширение - Строка
//
Процедура СоздатьВременныйКаталогПослеПолученияВременногоКаталога(ИмяКаталогаВременныхФайлов, Контекст) Экспорт 
	
	Оповещение = Контекст.Оповещение;
	Расширение = Контекст.Расширение;
	
	ИмяКаталога = "v8_" + Строка(Новый УникальныйИдентификатор);
	
	Если Не ПустаяСтрока(Расширение) Тогда 
		ИмяКаталога = ИмяКаталога + "." + Расширение;
	КонецЕсли;
	
	НачатьСозданиеКаталога(Оповещение, ИмяКаталогаВременныхФайлов + ИмяКаталога);
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.СоздатьВременныйКаталог.
Процедура СоздатьВременныйКаталогПриОбработкеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт 
	
	СтандартнаяОбработка = Ложь;
	ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
	СоздатьВременныйКаталогОповеститьОбОшибке(ОписаниеОшибки, Контекст);
	
КонецПроцедуры

// Продолжение процедуры ФайловаяСистемаКлиент.СоздатьВременныйКаталог.
Процедура СоздатьВременныйКаталогОповеститьОбОшибке(ОписаниеОшибки, Контекст)
	
	ПоказатьПредупреждение(, ОписаниеОшибки);
	ИмяКаталога = "";
	ВыполнитьОбработкуОповещения(Контекст.Оповещение, ИмяКаталога);
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#КонецОбласти